\section{Ap\'endice A}
\parindent = 0 pt
\parskip = 11 pt
\newcommand{\real}{\hbox{\bf R}}

\begin{centering}
\bf Laboratorio de M\'etodos Num\'ericos - Segundo cuatrimestre 2008 \\
\bf Trabajo Pr\'actico N\'umero 2: La Guerra Lineal, Episodio 4 \\
\end{centering}

\vskip 25pt
\hrule
\vskip 11pt

\textbf{Introducci\'on}

Hace mucho tiempo, en una galaxia muy, muy lejana, se libraba una batalla
que resultar\'\i a ser determinante para los destinos de todo el universo
conocido. Las fuerzas del sistema solar de la estrella Z-80 se enfrentaban
al ataque de un enemigo muy superior, que amenazaba con conquistar a todos
los planetas del sistema y comenzar as\'\i \ una avanzada sobre la
Rep\'ublica Gal\'actica.

Los planetas exteriores del sistema Z-80 resistieron con armamento
convencional durante varias semanas, pero pronto qued\'o claro que para
el ej\'ercito invasor este era s\'olo el primer paso: las inspecciones
telem\'etricas mostraron que fuera de los l\'\i mites del sistema solar
el enemigo estaba ensamblando un Ca\~n\'on Warp, el arma m\'as devastadora
construida por seres inteligentes. Los registros de la Rep\'ublica solamente
consignaban tres ataques previos por medio de este tipo de armas: en el
primer ataque al sistema Z-80\footnote{La Guerra Lineal, Episodio 1: TP1 del
segundo cuatrimestre de 2000.}, en la batalla de la estrella
80286\footnote{La Guerra Lineal, Episodio 2: TP2 del primer cuatrimestre de
2001}, y en las guerras de los clones de PCs\footnote{La Guerra Lineal, Episodio 3:
TP2 del primer cuatrimestre de 2005}.

La \'unica resistencia posible contra un Ca\~n\'on Warp es utilizar
otro Ca\~n\'on Warp, con lo cual se hizo un llamado desesperado a las fuerzas
de l\'\i nea de la Rep\'ublica para responder a este ataque. En menos de dos
semanas el Ca\~n\'on Warp del Ej\'ercito de la Rep\'ublica estaba preparado
para dar batalla, y el combate decisivo estaba por comenzar...

\textbf{La Guerra Lineal}

La batalla entre dos Ca\~nones Warp no es un combate entre bandoleros
espaciales, sino una caballerosa contienda algebraica entre dos naves que
respetan cierto n\'umero de reglas. Para no ser directamente visible,
cada nave se sit\'ua en un punto del hiperespacio de $n$ dimensiones.
Llamemos $x\in\real^n$ e $y\in\real^n$ a los puntos donde se ubican la
primera nave y la segunda nave, respectivamente.

A intervalos regulares, cada nave realiza un disparo de su Ca\~n\'on Warp
con el objetivo de desintegrar al enemigo. Debido a que nos encontramos en
el hiperespacio, la \'unica forma de dirigir el disparo hacia la posici\'on
de la nave enemiga es mediante una transformaci\'on del espacio-tiempo
(llamada una \emph{transformaci\'on warp}) que apunte nuestro ca\~n\'on
a la posici\'on de nuestro adversario. Una transformaci\'on warp est\'a
dada, entonces, por una matriz \emph{inversible} $A\in\real^{n\times n}$.
Si la nave $x$ realiza un disparo con esta transformaci\'on, entonces
el disparo se dirige a la posici\'on $d = Ax$. La nave enemiga es destruida
si y s\'olo si $||d-y||_2 \le 1$.

Ahora bien, supongamos que la nave $y$ no es destruida. Esta nave
puede ver el punto $d$ donde se produjo la explosi\'on y, analizando las
distorsiones sobre el fondo de estrellas fijas, tambi\'en puede deducir
la transformaci\'on warp $A$ que us\'o el enemigo. Entonces, al menos en
teor\'\i a, puede resolver el sistema $Ax = d$ para averiguar la posici\'on
$x$ del enemigo y eliminarlo en su siguiente disparo. Aqu\'\i \ entra en
juego la habilidad de cada contendiente para evitar ser f\'acilmente
descubierto luego de cada disparo propio, y para descubrir la ubicaci\'on
del rival luego de cada disparo enemigo.

La Guerra Lineal consiste en una sucesi\'on de disparos simult\'aneos de
cada contendiente, hasta que uno de ellos es destruido (o ambos son
destruidos al mismo tiempo). Luego de cada disparo, cada nave recibe la
informaci\'on de la posici\'on del disparo enemigo y la transformaci\'on
warp que us\'o el adversario, con lo cual podr\'a ajustar su siguiente
disparo para acercarse m\'as a su nave.

\textbf{Enunciado}

El objetivo del trabajo pr\'actico es implementar un programa que desarrolle
autom\'aticamente una batalla de la Guerra Lineal contra el programa de
otro grupo, de acuerdo con las siguientes especificaciones. Cada ejecuci\'on
del programa corresponde a un disparo del ca\~n\'on, y cualquier informaci\'on
que sea necesario registrar entre disparos se debe almacenar en archivos
auxiliares, a criterio del grupo. El programa de cada jugador se ejecuta por
l\'\i nea de comandos y toma como par\'ametros los nombres de dos archivos:

\begin{verbatim}
     lineal.exe datos.txt disparo.txt
\end{verbatim}

El primer archivo (\texttt{datos.txt} en el ejemplo) contiene los datos
necesarios  derivados del comienzo del juego o del disparo anterior. Cuando
comienza el juego, el archivo contiene el siguiente formato:
\begin{itemize}
\item La primera l\'\i nea contiene un cero, indicando que se comienza el juego.
\item La segunda l\'\i nea contiene el valor de $n$, especificando la 
cantidad de dimensiones del espacio en el que se juega.
\item La tercera l\'\i nea contiene la posici\'on del jugador, especificada
por $n$ valores separados por espacios.
\end{itemize}
Por ejemplo, el siguiente es un archivo v\'alido de entrada:

\begin{verbatim}
     0
     12
     2 5 5 4 2 5.6 3.2 2 1 1 0 2.3
\end{verbatim}

Luego de cada turno, el programa debe seleccionar una transformaci\'on
warp $A\in\real^{n\times n}$ y realizar un disparo $d = Ax$, informando
en el archivo de salida los valores del disparo $d$ y la transformaci\'on $A$.
Para esto, el programa debe escribir el archivo de salida (\texttt{disparo.txt}
en el ejemplo) con el siguiente formato:
\begin{itemize}
\item La primera l\'\i nea debe tener el n\'umero del turno (el primer turno
es el n\'umero 1).
\item La segunda l\'\i nea debe tener la dimensi\'on $n$ (este valor ya
es conocido, pero se incluye en el archivo para chequear que no haya
inconsistencias en la dimensi\'on).
\item La tercera l\'\i nea debe tener las $n$ coordenadas del vector $d$,
separadas por espacios.
\item Las siguientes $n$ l\'\i neas deben tener los coeficientes de la
matriz $A$, ubicando en cada l\'\i nea una fila completa de la matriz (con
los coeficientes separados por espacios).
\end{itemize}

Luego de escribir este archivo, el programa debe detener su ejecuci\'on
y ser\'a vuelto a ejecutar cuando llegue el momento de realizar un nuevo
disparo (en el siguiente turno). Cuando esto sucede, el archivo de entrada
(\texttt{datos.txt} en el ejemplo) es el mismo que gener\'o el programa rival,
con lo cual se tienen disponibles todos los datos para proceder con las
acciones del turno. Este proceso contin\'ua hasta que alguno de los dos
contendientes es eliminado.

En todo momento el combate estar\'a supervisado por un programa que oficiar\'a
de \'arbitro entre los dos programas en juego (por razones hist\'oricas, 
este \'arbitro ser\'a llamado \emph{La Fuerza}), que se encarga de ejecutar
ambos programas y de pasarles como par\'ametros los archivos que correspondan
en cada caso. Para asegurar el desarrollo normal de la competencia, el programa
jugador se debe implementar bajo el sistema operativo Windows, de manera tal
que sea posible su ejecuci\'on en las m\'aquinas del Laboratorio 4.

\textbf{Puntos importantes}

Es importante que el programa implementado cuente con estrategias
inteligentes de defensa, que no le permitan al enemigo deducir f\'acilmente
nuestra posici\'on. Por ejemplo, no ser\'\i a correcto utilizar como
transformaci\'on warp una matriz diagonal, dado que en este caso el enemigo
puede encontrar nuestra posici\'on con mucha precisi\'on. El informe debe
contener todas las alternativas que el grupo haya considerado con relaci\'on
a este punto, junto con una discusi\'on que justifique la opci\'on
finalmente seleccionada.

Tambi\'en es importante que el programa est\'e preparado para actuar ante
las posibles estrategias de defensa del enemigo. El programa debe contemplar
que el enemigo puede estar generando transformaciones warp que dificulten
nuestro an\'alisis de su posici\'on, e implementar alg\'un mecanismo que
intente manejar esta situaci\'on.

El combate debe desarrollarse en aritm\'etica de punto flotante de doble
precisi\'on (8 bytes, correspondiente al tipo de datos \texttt{double}).
La Fuerza tomar\'a los datos como \texttt{double}s, con lo cual es importante
tomar los recaudos necesarios para la lectura y escritura de los archivos.
No se aceptar\'an transformaciones warp que no sean inversibles, disparos
que est\'en mal calculados, o el uso indebido de espadas l\'aser entre los
contrincantes. Recuerden que la Guerra Lineal es un combate entre caballeros.

\vskip 15pt

\hrule

\vskip 11pt

Fecha de entrega: Lunes 29 de Septiembre
\newpage
